今天是鐵人賽第四天的文章,今天會講解Phi-4-mini的模型下載及測試。
首先在要使用Phi-4-mini的模型之前要先將模型下載下來,先附上程式碼:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
torch.random.manual_seed(0)
model_id = "microsoft/Phi-4-mini-reasoning"
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
save_path = "microsoft/Phi-4-mini-reasoning"
model.save_pretrained(save_path)
tokenizer.save_pretrained(save_path)
model_path = "microsoft/Phi-4-mini-reasoning"
model2 = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer2 = AutoTokenizer.from_pretrained(model_path)
def chat(prompt):
inputs = tokenizer2.apply_chat_template([{
"role": "user",
"content": prompt
}],add_generation_prompt=True,
return_dict=True,
return_tensors="pt",
)
outputs = model2.generate(
**inputs.to(model2.device),
max_new_tokens=32768,
temperature=0.8,
top_p=0.95,
do_sample=True,
)
outputs = tokenizer2.batch_decode(outputs[:, inputs["input_ids"].shape[-1]:])
return outputs
while(True):
inp = "hi"
inp = input("enter text:")
if(inp == "exit()"):
break
print(chat(inp))
接下來我將部分講解程式碼內容:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
torch.random.manual_seed(0)
上面這部分主要是進行匯入 PyTorch 與 Hugging Face Transformers 的必要模組,設定亂數種子為 0,確保每次生成的內容一致。
model_id = "microsoft/Phi-4-mini-reasoning"
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
上面這部分是指定模型ID,這裡使用微軟的Phi-4-mini-reasoning模型,使用from_pretrained()從Hugging Face Hub下載模型和tokenizer,使用 GPU (device_map="cuda") 加速推論,torch_dtype="auto":自動選擇最佳資料型態(如 float16),trust_remote_code=True:允許執行模型作者自定義的 Python 代碼。
save_path = "microsoft/Phi-4-mini-reasoning"
model.save_pretrained(save_path)
tokenizer.save_pretrained(save_path)
這部分是把前面下載的模型與 tokenizer 存到本地路徑中,以便重複使用時不需重新下載。
model_path = "microsoft/Phi-4-mini-reasoning"
model2 = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer2 = AutoTokenizer.from_pretrained(model_path)
這部分是從本地目錄重新載入模型與 tokenizer,和上面功能類似,只是這次不從網路下載,而是從已儲存的資料夾讀取。
def chat(prompt):
inputs = tokenizer2.apply_chat_template([{
"role": "user",
"content": prompt
}], add_generation_prompt=True, return_dict=True, return_tensors="pt")
outputs = model2.generate(
**inputs.to(model2.device),
max_new_tokens=32768,
temperature=0.8,
top_p=0.95,
do_sample=True,
)
outputs = tokenizer2.batch_decode(outputs[:, inputs["input_ids"].shape[-1]:])
return outputs
這部分是使用 tokenizer2.apply_chat_template 準備對話格式(符合 Phi 模型需求),generate() 是語言模型生成回應的核心函數:
max_new_tokens=32768:最多生成這麼多新詞。
temperature=0.8:控制生成隨機性。
top_p=0.95:nucleus sampling,保留累積機率達 95% 的詞彙作為候選。
do_sample=True:啟用隨機抽樣生成。
將生成的 tokens 轉換回文字並回傳。
while(True):
inp = "hi"
inp = input("enter text:")
if(inp == "exit()"):
break
print(chat(inp))
最後這部分是進入一個無限迴圈,讓使用者輸入問題,若輸入 exit() 則跳出程式,否則傳入 chat() 函數,取得回應後印出。